package bintree.LeetCode;
//662. 二叉树最大宽度

import java.util.ArrayList;
import java.util.Deque;
import java.util.LinkedList;
import java.util.List;

/**
 * 思路：给每个节点坐标记。设头节点编号为 i(1)，
 * 那么节点的左子树是 2*i, 那么节点的右子树是 2*i + 1
 * 用层序遍历，保留最大的宽度值。
 */
public class Num662_widthOfBinaryTree {

    public int widthOfBinaryTree(TreeNode root) {
        if (root == null) {
            return 0;
        }
        int res = 1;//有一个节点，最小宽度就是 1
        Deque<TreeNode> queue = new LinkedList<>(); //创建一个队列
        root.val = 1;//设置编号，起始值为 1
        queue.offer(root);
        while (!queue.isEmpty()) {
            int size = queue.size();//队列中有几个节点，那么就需要循环 size次来让他们的左右子树入队列
            //层序遍历，左子树先入。最右节点编号 - 最左节点编号 + 1 就是个数，与最大宽度值比较
            res = Math.max(queue.peekLast().val - queue.peekFirst().val + 1, res);
            while (size-- > 0) {
                TreeNode cur = queue.poll();
                if (cur.left != null) {
                    cur.left.val = cur.val * 2;
                    queue.offer(cur.left);
                }
                if (cur.right != null) {
                    cur.right.val = cur.val * 2 + 1;
                    queue.offer(cur.right);
                }
            }
        }
        return res;
    }

}
